package com.yuexia.yxim.common.code;

import com.yuexia.yxim.common.bean.msg.ProtoMsg;
import com.yuexia.yxim.common.enums.ProtoInstant;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 编码器
 * 将对象转换为bytebuf(ProtoMsg.Message)  然后通过网络发送出去
 *
 * 消息协议
 * -----------------------
 * ｜魔数｜版本号｜长度｜内容｜
 * -----------------------
 * @Author: yue_xia
 * @Date: 2020/5/31 7:55 下午
 */
public class ProtobufEncode extends MessageToByteEncoder<ProtoMsg.Message> {


    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, ProtoMsg.Message message, ByteBuf byteBuf) throws Exception {

        //将对象转换为字节
        byte[] bytes = message.toByteArray();

        //读取消息的长度
        int length = bytes.length;

        //写入魔数和版本号
        byteBuf.writeShort(ProtoInstant.MAGIC_CODE);
        byteBuf.writeShort(ProtoInstant.VERSION_CODE);

        //将消息长度写入，也就是消息头，这里只用两个字节，最大为32767
        byteBuf.writeShort(length);

        //写入数据体
        byteBuf.writeBytes(bytes);
    }
}
